perm filename DFTP.OLD[NET,MRC] blob sn#242252 filedate 1976-10-14 generic text, type T, neo UTF8
	TITLE	DFTP

	IF1,<PRINTX DFTP...>
	IF2,<PRINTX ...Is Halfway>



	F.TENX==0	; 0 IF TOPS-10, 1 IF TENEX

	F.PCAP==0	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED


; ***DEFINITIONS***

	DCHOST==37
	DCSOKT==303

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000
	SIZFIL==↑D5000

	LBUFS==100
	SBUFS==20

	THUD==-1

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	REG1==1
	REG2==2
	REG3==3
	REG4==4

;	(COMMONLY USED REGISTERS)
	IOREG==R5
	BPREG==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

; MACRO DEFINITIONS

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>

DEFINE	TAIN(MSG)
<	HRRZI	REG1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>
DEFINE	TCIL(ARG)
<	..CMCH==0
	..CMWD==0
	..CNUM==0
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..CNUM==..CNUM+1
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			IFG <..IDX-..CMCH>,<..CMCH==..IDX>>
		..FLAG==<-..FLAG>>
	IFL ..FLAG,<!!
		PRINTX BAD ARGUMENTS TO TCIN>
	..CMWD==<<<..CMCH-1>/5>+1>
	..LOC1==.
	..LOC2==..LOC1+4
	..LOC3==..LOC2+..CNUM
	RELOC ..LOC3
	..FLAG==1
	IRP ARG<
		IFG ..FLAG,<
			..IDX==0
			IRPC ARG<..IDX==..IDX+1>
			..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
			ASCII	/ARG/
			IFG ..IDX,<REPEAT ..IDX, <0>>
			..LOC3==.>
		IFL ..FLAG,<
			RELOC ..LOC2
			ARG
			..LOC2==.
			RELOC ..LOC3>
		..FLAG==<-..FLAG>>
	RELOC ..LOC1
	..LOC2
	..CNUM
	..CMCH
	..CMWD
	RELOC ..LOC3>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IOREG,[BUFFER,,5*BUFS]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IOREG,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IOREG,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRRZI	REG2,↑D10>
	IFNB <RADIX>,< HRRZI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <REG1-REG>,< MOVE	REG1,REG>
	IFB <RADIX>,< HRROI	REG2,↑D10>
	IFNB <RADIX>,< HRROI	REG2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	IOREG,STRING>
	IFNB <FLAGS>,<
		HRRI	IOREG,STRING
		HRLI	IOREG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	ILDB	0,SOURCE
	JUMPE	0,.+3
	IDPB	0,DESTIN
	JRST	.-3
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE>

; SYSTEM DEPENDENT DEFINITIONS

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	TTCALL	0,REG
	CAILE	REG,"Z"+40
	 JRST	.+3
	CAIL	REG,"A"+40
	 SUBI	REG,40>
DEFINE	TBOUT(REG)
<	TTCALL	1,REG>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	TTCALL	3,STRING>>

DEFINE	DCBIN(REG)
<	SKIPG	DCIBUF+2
	CALLR	NUTMI
	SOS	DCIBUF+2
	ILDB	REG,DCIBUF+1>
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	REG1,STRING
	CALLR	NUTMO>
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZ	REG1,DCOBUF
	CALLR	NUTDD
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT>
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
	SEARCH	STENEX

DEFINE	TBIN(REG)
<	PBIN
	CAILE	REG1,"Z"+40
	 JRST	.+3
	CAIL	REG1,"A"+40
	 SUBI	REG1,40
	IFN	<REG1-REG>,< HRRZI	REG,(REG1)>>
DEFINE	TBOUT(REG)
<	IFN	<REG1-REG>,< HRRZI	REG1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	REG1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	REG1,(REG2)
	PBOUT
	HRRZI	REG,(REG2)>
DEFINE	DCBOUT(REG)
<	MOVE	REG1,DCOJFN
	HRRZI	REG2,(REG)
	BOUT
	MOVEI	REG2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	REG1,STRING
	PSOUT>
	MOVE	REG1,DCOJFN
	SETZ	REG3,
	IRP STRING
<	HRROI	REG2,STRING
	SOUT>
	MOVEI	REG2,21
	MTOPR>
>
; (((↑↑↑)))


; ***PROGRAM***

DFTP:	RESET
	MOVE	STAK,[IOWD STSIZ,STBEG]
	CALLR	S$INIT
	CALLR	D$INIT

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
	MOVEI	UTIL,CMDM2
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!ENABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFN F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	REG1,400000	; FOR THIS FORK
		RPCAP
		TRNE	REG2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ /*/]>
	TCIN	(CMDMC1,[ASCIZ /*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ /*/]>
	TCIN	(CMDMC2,[ASCIZ /*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ /!/]>
	TCIN	(CMDMC3,[ASCIZ /!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
; (((TOPS-10)))
IFE F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,GET,CGET,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,GET,CGET,LINK,CLIN,LOCAL-DIRECTORY,CLOD,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
; *** MODE ONE COMMANDS ***
CMDMC1:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE TWO COMMANDS ***
CMDMC2:	TCIL	<ATTACH,CATT,CONNECT,CCON,COPY,CCOP,DELETE,CDEL,DIRECTORY,CDIR,ENABLE,CENA,EXEC,CEXE,GET,CGET,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
; *** MODE THREE COMMANDS ***
CMDMC3:	TCIL	<ALLOCATE,CALO,ATTACH,CATT,CHANGE,CCHA,CONNECT,CCON,COPY,CCOP,CREATE,CCRE,DELETE,CDEL,DIRECTORY,CDIR,DISABLE,CDIS,EXEC,CEXE,GET,CGET,LINK,CLIN,NO-DATALANGUAGE,CNOD,PUT,CPUT,QUIT,CQUI,RETRIEVE,CRET,SHOW-DATALANGUAGE,CSOD,STORE,CSTO,TIME-TRANSFERS,CTTR,UNTIME-TRANSFERS,CUTR,VERIFY,CVER>
>
; (((↑↑↑)))

CALO:	PATH	([ASCIZ / ALLOCATE /],PATHCC)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ / [Megabits:/]>
	TNIN	([ASCIZ / [Megabits:/])
	 JRST	CMDCMD
	MOVEM	IOREG,ABUF
	JUMPN	IOREG,CALO0
	MOVEI	IOREG,"0"
	TBOUT	<IOREG>
CALO0:	TSOUT	<[ASCIZ /]/],CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ / ATTACH /],PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ / CHANGE /],PATHCC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ / CONNECT /],PATHCA!PATHN2)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCOP:	PATH	([ASCIZ / COPY /],PATHCC!PATHRR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DCOP
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ / CREATE /],PATHCC)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ / DELETE /],PATHCC!PATHSS!PATHST!PATHPP!PATHAC)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ / DIRECTORY /],PATHCC!PATHN1!PATHSS!PATHST)
	 JRST	CMDCMD
	MOVE	IOREG,CMDMOD
	CAIN	IOREG,CMDM3
	 JRST	CDIR0
	TSOUT	<[ASCIZ /**/]>
	TCIN	(CDIRC1,[ASCIZ /**/])
	 JRST	CMDCMD
	 JRST	CDIR1
	JRST	CDIR2
CDIR0:	TSOUT	<[ASCIZ /!!/]>
	TCIN	(CDIRC2,[ASCIZ /!!/])
	 JRST	CMDCMD
	 JRST	CDIR1
	JRST	CDIR2
CDIR1:	TSOUT	<[ASCIZ /TERSE/]>
	MOVEI	FLAG,DD$T
CDIR2:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD
CDIRC1:	TCIL	<CREATION,DD$C,TERSE,DD$T,VERBOSE,DD$V>
CDIRC2:	TCIL	<CREATION,DD$C,PROTECTION,DD$P,TERSE,DD$T,VERBOSE,DD$V>

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

; (((TENEX)))
IFN F.TENX,<
CEXE:	MOVEI	REG1,37
	PBOUT
	HRRZI	REG1,-1
	RFMOD
	MOVE	R10,REG2
	RFCOC
	MOVE	R11,REG2
	MOVE	R12,REG3
	HRLZI	REG1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 THUD
	MOVE	UTIL,REG1
	HRLZI	REG1,(1B2+1B17)
	HRROI	REG2,[ASCIZ /<SYSTEM>EXEC.SAV/]
	GTJFN
	 THUD
	HRLI	REG1,(UTIL)
	GET			; LOAD EXEC INTO FORK
	MOVE	REG1,UTIL
	SETZ	REG2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	KFORK
	HRRZI	REG1,-1
	MOVE	REG2,R10
	SFMOD
	MOVE	REG2,R11
	MOVE	REG3,R12
	SFCOC
	JRST	CMDCMD
>
; (((↑↑↑)))

CGET:	PATH	([ASCIZ / GET /],PATHCC!PATHRL!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TTCALL	3,CRLF
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	MOVEI	REG1," "
	TTCALL	1,REG1
	TTCALL	3,ABUF
	TTCALL	3,CRLF
	JRST	CLOD1
>
; (((↑↑↑)))

CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ / PUT /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TSOUT	<CRLF>
	JRST	QUIT

CRET:	PATH	([ASCIZ / RETRIEVE /],PATHCC!PATHRL!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ / STORE /],PATHCC!PATHLR!PATHSS!PATHPP!PATHPO)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	PATH	([ASCIZ / VERIFY /],PATHCC!PATHLR!PATHSS!PATHPO)
	 JRST	CMDCMD
	CALLR	DVER
	 JRST	CMDCMD
	JRST	CMDCMD


; ***PATH INPUT AND TRANSLATION***

; FLAG DEFINITIONS
	PATHCT==400000		; TOP CONTEXT DEFAULT
	PATHCA==200000		; ATTACH CONTEXT DEFAULT
	PATHCC==100000		; CONNECT CONTEXT DEFAULT
	PATHRR==040000		; REMOTE [TO] REMOTE
	PATHLR==020000		; LOCAL [AS] REMOTE
	PATHRL==010000		; REMOTE [AS] LOCAL
	PATHSS==004000		; SETS -- ALLOWED
	PATHST==002000		; SETS -- TRAILING DEFAULT
	PATHN1==000400		; NULL DEFAULT ONE
	PATHN2==000200		; NULL DEFAULT TWO
	PATHPO==000040		; SECONDARY PATH -- OPEN
	PATHPP==000020		; SECONDARY PATH -- PARENT
	PATHAC==000001		; ACKNOWLEDGE-CONFIRM

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	IOREG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<UTIL,FLAG>
	MOVE	FLAG,IOREG
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	TLNN	FLAG,PATHN1!PATHN2
	 JRST	P$1I
	CAIN	TCIO,12
	 JRST	P$1N
	CAIN	TCIO,37
	 JRST	P$1N
P$1I:	MOVE	IOREG,[GBUF1,,5*LBUFS]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	JUMPN	UTIL,P$1T
P$1N:	TLNN	FLAG,PATHN1
	 JRST	P$1N3
	CAIN	IOREG,33
	 JRST	P$1N2
P$1N1:	MOVE	REG1,[ASCII /**/]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Nodes]/]>
	JRST	P$1E
P$1N2:	MOVE	REG1,[ASCII /</]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Connected Node]/]>
	JRST	P$1E
P$1N3:	MOVE	REG1,[ASCII /<</]
	MOVEM	REG1,GBUF1
	TSOUT	<[ASCIZ /[Attached Node]/]>
	JRST	P$1E
P$1T:	TLNN	FLAG,PATHST
	 JRST	P$1E
	CAIN	IOREG,33
	 JRST	P$1T1
	CAIN	IOREG," "
	 JRST	P$1T1
	JRST	P$1E
P$1T1:	MOVE	REG1,[440700,,GBUF1]
	ILDB	REG2,REG1
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPE	REG2,P$1T2
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPE	REG2,P$1T2
	CAIE	REG2,"<"
	 JRST	P$1T3
	ILDB	REG2,REG1
	JUMPN	REG2,P$1T3
P$1T2:	MOVEI	REG3,"*"
	DPB	REG3,REG1
	IDPB	REG3,REG1
	IDPB	REG2,REG1
	TSOUT	([ASCIZ /[Nodes]/])
	JRST	P$1E
P$1T3:	ILDB	REG2,REG1
	JUMPN	REG2,P$1T3
	MOVEI	REG3,">"
	DPB	REG3,REG1
	MOVEI	REG3,"*"
	IDPB	REG3,REG1
	IDPB	REG3,REG1
	IDPB	REG2,REG1
	TSOUT	([ASCIZ />[Nodes]/])
P$1E:	TLNE	FLAG,PATHLR!PATHRL!PATHRR
	 JRST	P$2
	TLNN	FLAG,PATHAC
	 JRST	P$1E1
	TAIN	<[ASCIZ / [Confirm]/]>
	 RETURN
	 RETURN
	JRST	P$1E2
P$1E1:	TSOUT	<CRLF>
P$1E2:	TLNN	FLAG,PATHPP
	 JRST	P$1E3
	MOVE	IOREG,[GBUF1,,PBUF]
	HRRZI	UTIL,GBUF2
	CALLR	P$CS
	RETURN	SKIP,1
P$1E3:	MOVE	IOREG,[GBUF1,,PBUF]
	CALLR	P$CP
	RETURN	SKIP,1
P$2:	TLNE	FLAG,PATHRR
	 JRST	P$2C
; (((TENEX)))
IFN F.TENX,<
	SKIPN	LFILE
	 JRST	.+5
	TLNN	FLAG,PATHRL
	 JRST	.+3
	CALLR	P$LF
	JRST	P$2MP
>
; (((↑↑↑)))
	CAIN	IOREG,33
	 JRST	P$2M
	CAIN	IOREG," "
	 JRST	P$2M
	CALLR	P$LF
	JRST	P$2MP
P$2C:	TSOUT	<[ASCIZ / [To] /]>
	MOVE	IOREG,[UBUF1,,5*LBUFS]
	MOVE	UTIL,[GBUF1,,[ASCIZ / [To] /]]
	CALLR	P$IN
	 RETURN
	TSOUT	<CRLF>
	MOVE	IOREG,[GBUF1,,GBUF2]
	CALLR	P$CP
	MOVE	IOREG,[UBUF1,,GBUF1]
	HRRZI	UTIL,PBUF
	CALLR	P$CS
	MOVE	IOREG,[GBUF2,,UBUF2]
	CALLR	P$ON
	MOVE	IOREG,[GBUF1,,UBUF1]
	CALLR	P$ON
	RETURN	SKIP,1
P$2M:	TSOUT	<[ASCIZ / [As] /]>
	TLNN	FLAG,PATHLR
	 JRST	P$2ML
	MOVE	REG1,[GBUF1,,ABUF]
	BLT	REG1,<ABUF+SBUFS-1>
	MOVE	IOREG,[GBUF1,,5*LBUFS]
	MOVE	UTIL,[ABUF,,[ASCIZ / [As] /]]
	CALLR	P$IN
	 RETURN
	JRST	P$2MP
P$2ML:	MOVE	IOREG,[ABUF,,5*SBUFS]
	MOVE	UTIL,[GBUF1,,[ASCIZ / [As] /]]
	CALLR	P$IN
	 RETURN
; (((TOPS-10)))
IFE F.TENX,<
P$2MP:	TSOUT	<CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
P$2MP:	SKIPE	LJFN
	 JRST	.+3
	MOVEI	REG1,37
	PBOUT
>
; (((↑↑↑)))
	CALLR	P$LN
	TLNN	FLAG,PATHPP
	 JRST	P$2M1
	MOVE	IOREG,[GBUF1,,PBUF]
	HRRZI	UTIL,GBUF2
	CALLR	P$CS
	JRST	P$2M2
P$2M1:	MOVE	IOREG,[GBUF1,,PBUF]
	CALLR	P$CP
P$2M2:	MOVE	IOREG,[PBUF,,ABUF]
	CALLR	P$ON
	ENDR	SKIP,1

; PATH INPUT
;   IN: IOREG -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IOREG -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$GE==100000		; GROUP ENCOUNTERED (*)
	P$I$PW==040000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$FN==000400		; FILE NAME
;
P$IN:	BEGINR	<BPREG,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IOREG
	MOVE	R12,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,440700
	SETZ	UTIL,
P$ICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	P$IREP
	CAIN	IOREG,"A"-100
	 JRST	P$IDEL
	CAIN	IOREG,"X"-100
	 JRST	P$IENR
	CAIN	IOREG,177
	 JRST	P$IENR
	CAIN	IOREG,15
	 JRST	P$ICHR
	CAIN	IOREG,12
	 JRST	P$IEND
	CAIN	IOREG,33
	 JRST	P$IEND
	CAIN	IOREG,37
	 JRST	P$IEND
	CAIGE	IOREG," "
	 JRST	P$IBAD
	CAIN	IOREG,42
	 JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IOREG," "
	 JRST	P$IEND
	CAIN	IOREG,":"
	 JRST	P$IPON
	CAIN	IOREG,"'"
	 JRST	P$IPON
	CAIN	IOREG,"?"
	 JRST	P$IBAD
	CAIN	IOREG,"<"
	 JRST	P$ISA
	CAIN	IOREG,">"
	 JRST	P$ISD1
	CAIN	IOREG,"."
	 JRST	P$ISD2
	CAIN	IOREG,"*"
	 JRST	P$ISG
	TRNE	R10,P$I$GE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IOREG,">"
	 JRST	P$IPOF
	CAIN	IOREG,"'"
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	AOJA	UTIL,P$ICHR
P$ISA:	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$FN
	 JRST	P$IBAD
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	TROE	R10,P$I$DE
	 JRST	P$IBAD
	TRZ	R10,P$I$GE
	JRST	P$ICHE
P$ISD2:	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$AE
	 JRST	P$IBAD
	TROE	R10,P$I$DE!P$I$FN
	 JRST	P$IBAD
	TRZ	R10,P$I$GE
	JRST	P$ICHE
P$ISG:	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$GE
	JRST	P$ICHE
P$IPON:	TRNE	R10,P$I$AE!P$I$DE!P$I$GE
	 JRST	P$IBAD
	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	MOVEI	REG1,1(UTIL)
	CAIL	REG1,(R11)
	 JRST	P$IBAD
	MOVEI	REG1,"P"-100
	IDPB	REG1,BPREG
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IOREG,R13
	JUMPE	IOREG,P$IR03
	CAIN	IOREG,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IOREG>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IOREG,(BPREG)
	HLR	R13,R11
	CAIGE	IOREG,(R13)
	 JRST	P$ICHR
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BPREG
	 JRST	P$ICHR
	ILDB	IOREG,R13
	CAIN	IOREG,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IOREG>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	CAIN	IOREG,"P"-100
	 JRST	P$ID01
	LDB	REG1,BPREG
	CAIN	REG1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IOREG>
	TRZ	R10,P$I$AE!P$I$DE!P$I$GE
	CAIN	IOREG,"."
	 TRZ	R10,P$I$FN
	CAIE	IOREG,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SUBI	UTIL,1
	JUMPE	UTIL,P$ICHR
	LDB	REG1,BPREG
	CAIN	REG1,"<"
	 TRO	R10,P$I$AE
	CAIN	REG1,">"
	 TRO	R10,P$I$DE
	CAIN	REG1,"."
	 TRO	R10,P$I$DE
	CAIN	REG1,"*"
	 TRO	R10,P$I$GE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IOREG,BPREG
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
P$ID03:	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
P$IEND:	TRNE	R10,P$I$DE
	 JRST	P$IBAD
; (((TENEX)))
IFN F.TENX,<
	TLNN	FLAG,PATHLR!PATHRL
	 JRST	P$IENN
	JUMPN	UTIL,P$IENN
	CAIG	R12,-1
	 JRST	.+3
	TLNE	FLAG,PATHLR
	 JRST	P$IBAD		; PUT -- SECOND ARGUMENT
	MOVEI	REG1,76
	PBOUT
	TLNE	FLAG,PATHLR
	 HRLZI	REG1,160003	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	REG1,660003	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	REG2,[100,,101]
	GTJFN
	 JRST	P$IENR
	MOVEM	REG1,LJFN
	HRROI	REG1,LFILE
	MOVE	REG2,LJFN
	SETZ	REG3,
	JFNS
	MOVEI	REG1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IOREG,(REG1)
	CAILE	R12,-1
	 JRST	P$IENE		; GET -- SECOND ARGUMENT
	HLRO	REG1,R11
	MOVE	REG2,LJFN
	MOVE	REG3,[1B8+1B11+1B35] ; NAME,EXT,PUNCTUATION
	TLNN	FLAG,PATHLR
	 JRST	.+5
	CAIN	IOREG,33
	 SETZ	REG3,
	CAIN	IOREG," "
	 SETZ	REG3,
	JFNS			; FIRST ARGUMENTS
	JUMPE	REG3,P$IENE
	LDB	REG2,REG1
	CAIE	REG2,"."
	 JRST	P$IENE
	SETZ	REG2,
	DPB	REG2,REG1
P$IENE:	MOVE	REG1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	SETZM	LJFN
	CAIN	IOREG,12
	 SETOM	LJFN
	CAIN	IOREG,37
	 SETOM	LJFN
	RETURN	SKIP,1
P$IENN:	SETZM	LFILE
	SETZM	LJFN
>
; (((↑↑↑)))
	TLNN	FLAG,PATHN1!PATHN2
	 JUMPE	UTIL,P$IBAD
	SETZ	R13,
	IDPB	R13,BPREG
	ENDR	SKIP,1

; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IOREG -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IOREG,FLAG>
	MOVEI	REG1,<<LBUFS*5>-1>
	HLR	REG2,IOREG
	HRLI	REG2,350700
	HRRI	REG3,(IOREG)
	HRLI	REG3,440700
	LDB	IOREG,REG2
	CAIN	IOREG,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCC
	ILDB	IOREG,REG2
	CAIE	IOREG,"<"
	 JRST	P$CPCA
	ILDB	IOREG,REG2
P$CPCT:	MOVE	REG4,[440700,,[ASCIZ /%TOP./]]
	SCOPY	(REG4,REG3)
	MOVE	REG4,[440700,,ANCHOR]
	SCOPY	(REG4,REG3)
	SUBI	REG1,11
	JRST	P$CPCE
P$CPCA:	MOVE	REG4,[440700,,[ASCIZ /%LOGIN/]]
	SCOPY	(REG4,REG3)
	SUBI	REG1,6
	JRST	P$CPCE
P$CPCC:	MOVE	REG4,[440700,,CONTEX]
	ILDB	0,REG4
	JUMPE	0,.+4
	SOJL	REG1,P$CPE
	IDPB	0,REG3
	JRST	.-4
	MOVE	REG4,REG3
	IDPB	0,REG4
P$CPCE:	JUMPE	IOREG,P$CPZ0
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	SUBI	REG1,1
	MOVEI	REG4,42
	SETZ	FLAG,
	JRST	P$CPI0
P$CPI:	ILDB	IOREG,REG2
P$CPI0:	CAIN	IOREG,"P"-100
	 JRST	P$CPI
	CAIN	IOREG,">"
	 JRST	P$CPS
	CAIN	IOREG,"."
	 JRST	P$CPS
	JUMPE	IOREG,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IOREG,":"
	 JRST	P$CPP
	CAIN	IOREG,"'"
	 JRST	P$CPP
	CAIN	IOREG,"*"
	 JRST	P$CPO
	CAIGE	IOREG,"A"
	 JRST	P$CPQ
	CAILE	IOREG,"Z"
	 JRST	P$CPQ
P$CPO:	SOJL	REG1,P$CPE
	IDPB	IOREG,REG3
	JRST	P$CPI
P$CPQ:	SOJL	REG1,P$CPE
	IDPB	REG4,REG3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IOREG,"'"
	IDPB	IOREG,REG3
	MOVEI	IOREG,")"
	IDPB	IOREG,R3
	SETZ	FLAG,
	MOVEI	IOREG,"."
	JRST	P$CPO
P$CPP:	SUBI	REG1,4
	JUMPL	REG1,P$CPE
	MOVEI	IOREG,"("
	IDPB	IOREG,R3
	MOVEI	IOREG,"'"
	IDPB	IOREG,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ / (Pathname too long.)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,.+5
	MOVEI	REG1,"'"
	IDPB	REG1,REG3
	MOVEI	REG1,")"
	IDPB	REG1,REG3
P$CPZ0:	IDPB	IOREG,REG3
	ENDR

; CONVERT PATH -- SUPERIOR (IF ANY) AND COMPLETE PATH
;   IN: IOREG -- SOURCE,,DESTINATION
;	UTIL -- DESTINATION OF SUPERIOR PATH
;
P$CS:	BEGINR	<BPREG,UTIL>
	HLR	REG1,IOREG
	HRLI	REG1,440700
	MOVE	REG2,REG1
	SETZM	(UTIL)
P$CS1:	ILDB	REG3,REG2
	JUMPE	REG3,P$CS2
	CAIN	REG3,">"
	 MOVE	REG1,REG2
	CAIN	REG3,"<"
	 MOVE	REG1,REG2
	JRST	P$CS1
P$CS2:	ILDB	REG2,REG1
	JUMPE	REG2,P$CS3
	CAIE	REG2,"."
	 JRST	P$CS2
	MOVE	BPREG,REG1
	SETZ	REG1,
	DPB	REG1,BPREG
	HRLI	UTIL,(IOREG)
	HRRI	IOREG,(UTIL)
	CALLR	P$CP
	HLR	IOREG,UTIL
	MOVEI	REG1,">"
	DPB	REG1,BPREG
P$CS3:	CALLR	P$CP
	ENDR

; DATACOMPUTER OPEN NODE NAME
;   IN: IOREG -- SOURCE,,DESTINATION
;
P$ON:	BEGINR
	HLR	REG1,IOREG
	HRLI	REG1,440700
	MOVE	REG2,REG1
P$ONI:	ILDB	REG3,REG2
	JUMPE	REG3,P$ONM
	CAIN	REG3,"."
	 MOVE	REG1,REG2
	CAIN	REG3,42
	 IBP	REG2
	JRST	P$ONI
P$ONM:	HRRI	REG2,(IOREG)
	HRLI	REG2,440700
P$ONM1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,P$ONM1
	ENDR

; LOCAL FILE NAME FIND
;
P$LF:	BEGINR
	MOVE	REG1,[440700,,GBUF1]
	MOVE	REG2,[440700,,GBUF1]
P$LFI:	ILDB	REG3,REG2
	JUMPE	REG3,P$LFM
	CAIN	REG3,">"
	 MOVE	REG1,REG2
	CAIN	REG3,"<"
	 MOVE	REG1,REG2
	JRST	P$LFI
P$LFM:	MOVE	REG2,[440700,,ABUF]
P$LFM1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,P$LFM1
	ENDR

; LOCAL FILE NAME PREPARATION
;
P$LN:	BEGINR	<IOREG>
; (((TOPS-10)))
IFE F.TENX,<
	HRRZI	IOREG,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	SKIPE	LFILE
	 RETURN
	MOVE	IOREG,[ABUF,,LFILE]
	BLT	IOREG,<LFILE+SBUFS-1>
>
; (((↑↑↑)))
	ENDR


; ***DATACOMPUTER INTERFACE ROUTINES***

; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IOREG,BPREG,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	.+2
	JRST	D$IN0
	TSOUT	<[ASCIZ / ?? DATACOMPUTER INITIALIZATION FAILURE ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ / [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	REG1,(UTIL)
	CAME	REG1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IOREG,[440700,,[ASCIZ /%TOP.DFTP./]]
	MOVE	BPREG,[440700,,ABUF]
	SCOPY	(IOREG,BPREG)
	HRR	IOREG,(UTIL)
	HRLI	IOREG,440700
	SCOPY	(IOREG,BPREG)
	MOVEI	IOREG,"."
	IDPB	IOREG,BPREG
; (((TOPS-10)))
IFE F.TENX,<
	MOVE	REG1,[-1,,31]
	MOVE	REG2,[-1,,32]
	GETTAB	REG1,
	 THUD
	GETTAB	REG2,
	 THUD
	MOVEM	REG1,UBUF1
	MOVEM	REG2,<UBUF1+1>
	SETZM	<UBUF1+2>
	MOVE	REG1,[440600,,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+7
	ADDI	REG3,40
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-7
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	GJINF
	CAMN	REG1,REG2
	 JRST	.+10
	HRROI	REG1,[ASCIZ /  (from /]
	PSOUT
	MOVEI	REG1,101
	DIRST
	 THUD
	HRROI	REG1,[ASCIZ /)
/]
	PSOUT
	HRROI	REG1,UBUF1
	DIRST
	 THUD
	MOVE	REG1,[440700,,UBUF1]
	MOVEI	REG2,42
	ILDB	REG3,REG1
	JUMPE	REG3,.+6
	CAIL	REG3,"A"
	 CAILE	REG3,"Z"
	  IDPB	REG2,BPREG
	IDPB	REG3,BPREG
	JRST	.-6
	MOVE	REG1,BPREG
	IDPB	REG3,REG1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ /LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	DCSOUT	<[ASCIZ /LIST /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ /  [Password:/]>
	TSIN	(UBUF1,LBUFS,<[ASCIZ /  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ /]/],CRLF>
	MOVE	REG2,BPREG
	MOVEI	REG1,"("
	IDPB	REG1,REG2
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVE	REG1,[440700,,UBUF1]
	SCOPY	(REG1,REG2)
	MOVEI	REG1,"'"
	IDPB	REG1,REG2
	MOVEI	REG1,")"
	IDPB	REG1,REG2
	SETZ	REG1,
	IDPB	REG1,REG2
	DCSOUT	<[ASCIZ /LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	D$INP
	TSOUT	<[ASCIZ /   (Incorrect password.)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ / [Attaching]/],CRLF>
D$IND:	MOVE	REG1,[440700,,[ASCIZ /%TOP.DFTP.DFTP.GUEST/]]
	MOVE	REG2,[440700,,ABUF]
	SCOPY	(REG1,REG2)
	DCSOUT	<[ASCIZ /LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ /  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ /MODIFY /],PBUF,<[ASCIZ /,M=/]>>
	MOVE	IOREG,ABUF
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ /CLOSE %OPEN/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ /LOGIN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /OPEN %TOP.DFTP."<PORT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IOREG,UTIL>
	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ /DELETEP /],PBUF,<[ASCIZ /,N=1/]>,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCHAD
	TSOUT	<[ASCIZ / [OK]/],CRLF>
DCHAI:	TAIN	<[ASCIZ / Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETOM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ /  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN	<[ASCIZ /  Restrict via network? /]>
	 JRST	DCHAI
	 JRST	DCHAI3
	TSOUT	<[ASCIZ /   Site: /]>
	TNIN	([ASCIZ /   Site: /],10)
	 JRST	DCHAI
	JUMPE	IOREG,DCHAI1
	MOVEM	IOREG,<ABUF+1>
	TSOUT	<CRLF>
	TSOUT	<[ASCIZ /   Socket: /]>
	TNIN	([ASCIZ /   Socket: /],10)
	 JRST	DCHAI
	JUMPN	IOREG,DCHAI2
	TSOUT	<[ASCIZ /(Any)/]>
	JRST	DCHAI2
DCHAI1:	MOVE	IOREG,LHOST
	MOVEM	IOREG,<ABUF+1>
	TSOUT	<[ASCIZ /(Local)/],CRLF>
	TSOUT	<[ASCIZ /   User: /]>
; (((TOPS-10)))
IFE F.TENX,<
	TNIN	([ASCIZ /   User: /],10)
	 JRST	DCHAI
	LSH	IOREG,11
	ADDI	IOREG,100
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	TSIN	(UBUF1,LBUFS,[ASCIZ /   User: /])
	 JRST	DCHAI
	SETZ	REG1,
	MOVE	REG2,[440700,,UBUF1]
	STDIR
	 JRST	.+3
	 JRST	.+2
	JRST	.+4
	HRROI	REG1,[ASCIZ / (User not found.)
/]
	PSOUT
	JRST	DCHAI
	HRRZI	IOREG,(REG1)
	LSH	IOREG,↑D15
	ADDI	IOREG,20
>
; (((↑↑↑)))
DCHAI2:	MOVEM	IOREG,<ABUF+2>
	TSOUT	<CRLF>
DCHAI3:	TAIN	<[ASCIZ /  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ /   Password: /]>
	TSIN	(<ABUF+3>,<SBUFS-3>,[ASCIZ /   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ /CREATEP /],PBUF,<[ASCIZ /,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ /C/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ /,H=/]>>
	MOVE	IOREG,<ABUF+1>
	DCNOUT	<IOREG>
	DCSOUT	<<[ASCIZ /,S=/]>>
	MOVE	IOREG,<ABUF+2>
	JUMPE	IOREG,DCHAC2
	DCNOUT	<IOREG>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ /ANY/]>
DCHAC3:	SETO	IOREG,
	CAMN	IOREG,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ /,P='/]>,<ABUF+3>,[ASCIZ /'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ /  [OK]/],CRLF>
	JRST	DCHAI
	ENDR

; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ / [Old Node]/],CRLF>
	JRST	DCON2
	RETURN
DCON1:	TAIN	<[ASCIZ / [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	REG1,[440700,,PBUF]
	MOVE	REG2,[440700,,CONTEX]
	SCOPY	(REG1,REG2)
	ENDR

; DCOP -- COPY FILES WITHIN THE DATACOMPUTER
;
DCOP:	BEGINR	<FLAG>
	SETZ	FLAG,
	MOVE	REG1,[440700,,UBUF1]
	MOVE	REG2,[440700,,UBUF2]
	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DCOP0
	JUMPN	REG3,.-4
	CALLR	DCOP$T
	RETURN
DCOP0:	DCSOUT	<[ASCIZ /OPEN /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /LIST /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	DCOP1
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 JRST	DCOPE3
	 JRST	DCOPE3
	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE3
	JRST	DCOP2
DCOP1:	TSOUT	<[ASCIZ / [New File]/],CRLF>
	SKIPN	PBUF
	 JRST	DCOP2
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCOP2
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE2
	SETO	FLAG,
DCOP2:	DCSOUT	<[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE2
	DCSOUT	<UBUF1,[ASCIZ /=/],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE1
	DCSOUT	<[ASCIZ /CLOSE /],UBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOPE1
	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DCOPE1:	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOPE2:	JUMPE	FLAG,DCOPE3
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOPE3:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	ENDR
; ('TEMPORARY FILE' COPY)
DCOP$T:	BEGINR
	DCSOUT	<[ASCIZ /LIST /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	DCOT1
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 RETURN
	 RETURN
	JRST	DCOT2
DCOT1:	TSOUT	<[ASCIZ / [New File]/],CRLF>
DCOT2:	DCSOUT	<[ASCIZ /OPEN /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /CREATE "<TEMPORARY" FILE"> LIKE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE1
	DCSOUT	<[ASCIZ /"<TEMPORARY" FILE">=/],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE2
	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE4
	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
	SKIPN	PBUF
	 JRST	DCOT3
	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DCOT3
	DCSOUT	<[ASCIZ /CREATE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	SETO	FLAG,
DCOT3:	DCSOUT	<[ASCIZ /CREATE /],GBUF1,[ASCIZ / LIKE "<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE4
	DCSOUT	<UBUF1,[ASCIZ /="<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	DCSOUT	<[ASCIZ /CLOSE /],UBUF1,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DCOTE3
	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DCOTE1:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	RETURN
DCOTE2:	DCSOUT	<[ASCIZ /CLOSE /],UBUF2,SEMI>
	CALLR	RENDER
	 JRST	DCOTE4
	JRST	DCOTE4
DCOTE3:	DCSOUT	<[ASCIZ /DELETE /],GBUF1,SEMI>
	CALLR	RENDER
	 JRST	.+1
	JUMPE	FLAG,DCOTE4
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	.+1
DCOTE4:	DCSOUT	<[ASCIZ /DELETE "<TEMPORARY" FILE">/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ /CREATE /],PBUF,<[ASCIZ /,M=/]>>
	MOVEI	IOREG,DEFALO
	DCNOUT	<IOREG>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR

; DDEL -- DELETE NODES/FILES
;
DDEL:	BEGINR
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DDEL0
	SKIPN	GBUF2
	 JRST	DDEL0
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+1
DDEL0:	DCSOUT	<[ASCIZ /LIST /],CONTEX,SEMI>
	CALLR	RENDER
	 JRST	.+2
	RETURN
	TSOUT	<[ASCIZ / [Connected To Attached Node]/],CRLF>
	MOVE	REG1,[ASCII /%LOGI/]
	MOVEM	REG1,CONTEX
	MOVE	REG1,[ASCII /N/]
	MOVEM	REG1,<CONTEX+1>
	ENDR

; DDIR -- LIST THE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IOREG,UTIL>
	SETZ	UTIL,
	SETZM	GBUF1
	MOVE	REG1,[GBUF1,,GBUF1+1]
	BLT	REG1,<GBUF1+LBUFS-1>
	MOVEI	REG1,<GBUF2+1>
	MOVEM	REG1,GBUF2
; (((TENEX)))
IFN F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DD$C
	 JRST	DDIRO1
	CAIN	FLAG,DD$P
	 JRST	DDIRO2
	CAIN	FLAG,DD$T
	 JRST	DDIRO3
	CAIN	FLAG,DD$V
	 JRST	DDIRO4
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %SOURCE/],SEMI>
	JRST	DDIRI
DDIRO2:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %PRIVILEGE/],SEMI>
	JRST	DDIRI
DDIRO3:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %NAME/],SEMI>
	JRST	DDIRI
DDIRO4:	DCSOUT	<[ASCIZ /LIST /],PBUF,[ASCIZ / %INFORMATION/],SEMI>
DDIRI:	CALLR	RENPRE
	CAMN	IOREG,[ASCII /.I280/]
	 JRST	DDIRD
	CALLR	RENLIP
	JRST	DDIRER
; (((TOPS-10)))
IFE F.TENX,<
DDIRN:	DCBIN	<IOREG>
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
DDIRN:	SKIPN	FLAGCO
	 JRST	DDIRN0
	HRROI	REG1,[ASCIZ / [Aborting]
/]
	PSOUT
	MOVE	REG1,DCOJFN
	MOVEI	REG2,22
	MTOPR
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<SEMI>
	JRST	DDIRER
DDIRN0:	DCBIN	<IOREG>
>
; (((↑↑↑)))
	CAIE	IOREG," "
	 JRST	DDIRE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DDIRD
	CALLR	<(FLAG)>
	JRST	DDIRN
DDIRD:	CALLR	RENLIN
	JRST	DDIRN
DDIRE:	CAIN	IOREG,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DDIRER
	TSOUT	<[ASCIZ / [No Nodes]/],CRLF>
DDIRER:	CALLR	RENDER
	 RETURN
	ENDR

; DD$C -- CREATION
;
DD$C:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$C5
DD$C1:	DCBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	DD$C3
	CAIE	IOREG,"*"
	 JRST	DD$C1
	MOVEI	IOREG,11
	TBOUT	<IOREG>
DD$C2:	DCBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	DD$C4
	CAIN	IOREG,"*"
	 JRST	DD$C4
	TBOUT	<IOREG>
	JRST	DD$C2
DD$C3:	TSOUT	<[ASCIZ /	[Undated]/]>
DD$C4:	TSOUT	<CRLF>
DD$C5:	CALLR	RENLIN
	ENDR

; DD$P -- PROTECTION
;
DD$P:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DD$P1:	MOVEI	IOREG,GBUF1
DD$P2:	SKIPE	(IOREG)
	 AOJA	IOREG,DD$P2
	SUBI	IOREG,GBUF1
DD$P3:	TSOUT	<[ASCIZ /    /]>
	SOJGE	IOREG,DD$P3
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DD$P4:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DD$P4
	ENDR

; DD$T -- TERSE
;
DD$T:	BEGINR	<IOREG>
	CALLR	DD$NAM
	 JRST	DD$T4
	DCBIN	<IOREG>
	CAIN	IOREG,"F"
	 JRST	DD$T1
	CAIN	IOREG,"P"
	 JRST	DD$T2
	JRST	DD$T3
DD$T1:	TSOUT	<[ASCIZ / 	[F]/]>
	JRST	DD$T3
DD$T2:	TSOUT	<[ASCIZ / 	[P]/]>
DD$T3:	TSOUT	<CRLF>
DD$T4:	CALLR	RENLIN
	ENDR

; DD$V -- VERBOSE
;
DD$V:	BEGINR	<IOREG,UTIL,FLAG>
DD$VN:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DD$VN
	CALLR	DD$NAM
	 JRST	DD$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DD$VF:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	DD$VF
	DCBIN	<IOREG>
	SETZ	FLAG,
	CAIN	IOREG,"F"
	 MOVEI	FLAG,3
	CAIN	IOREG,"P"
	 MOVEI	FLAG,1
	CAIN	IOREG,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DD$VE
	CALLR	RENLIN
DD$VD:	MOVEI	IOREG,(UTIL)
DD$VD0:	TSOUT	<[ASCIZ /    /]>
	SOJGE	IOREG,DD$VD0
	MOVEI	IOREG,"]"
	TBOUT	<IOREG>
DD$VD1:	DCBIN	<IOREG>
	TBOUT	<IOREG>
	CAIE	IOREG,12
	 JRST	DD$VD1
	SOJG	FLAG,DD$VD
	RETURN
DD$VE:	CALLR	RENLIN
	ENDR

; DD$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IOREG -- LAST CHARACTER INPUT
;
DD$NAM:	BEGINR	<BPREG,UTIL,FLAG,R10>
	SETZ	R10,
	SETZ	FLAG,
	MOVE	BPREG,[440700,,ABUF]
	MOVEI	UTIL,<SBUFS*5>
	DCBIN	<IOREG>
	CAILE	IOREG," "
	 JRST	DD$NA1
	RETURN
DD$NAN:	DCBIN	<IOREG>
DD$NA1:	CAIN	IOREG,"."
	 JRST	DD$NIN
	CAIG	IOREG," "
	 JRST	DD$NA3
	CAIE	IOREG,42
	 JRST	DD$NA2
	DCBIN	<IOREG>
DD$NA2:	IDPB	IOREG,BPREG
	SOJG	UTIL,DD$NAN
	JRST	DD$NER
DD$NA3:	SETZ	REG1,
	IDPB	REG1,BPREG
	TSOUT	<[ASCIZ /  /],ABUF>
	RETURN	SKIP,1
DD$NIN:	MOVE	BPREG,[440700,,ABUF]
	MOVEI	UTIL,<SBUFS*5>
DD$NI1:	DCBIN	<IOREG>
	CAIN	IOREG,"."
	 JRST	DD$NCN
	CAIG	IOREG," "
	 JRST	DD$NCN
DD$NI2:	CAIE	IOREG,42
	 JRST	DD$NI3
	DCBIN	<IOREG>
DD$NI3:	IDPB	IOREG,BPREG
	SOJG	UTIL,DD$NI1
	JRST	DD$NER
DD$NCN:	SETZ	REG1,
	IDPB	REG1,BPREG
	SKIPN	REG2,GBUF1(FLAG)
	 JRST	DD$NON
	HRLI	REG2,440700
	MOVE	REG1,[440700,,ABUF]
DD$NC1:	ILDB	REG3,REG1
	ILDB	REG4,REG2
	CAIE	REG3,(REG4)
	 JRST	DD$NON
	JUMPN	REG3,DD$NC1
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DD$NIN
DD$NON:	CAIL	FLAG,LBUFS-2
	 JRST	DD$NER
	SETZM	GBUF1+1(FLAG)
	HRL	REG1,GBUF1+1(FLAG)
	HRR	REG1,GBUF1+2(FLAG)
	BLT	REG1,<GBUF1+LBUFS-1>
	MOVE	REG1,[440700,,ABUF]
	SKIPN	REG2,GBUF1(FLAG)
	 HRR	REG2,GBUF2
	HRLI	REG2,440700
	HRRZI	BPREG,(BPREG)
	SUBI	BPREG,<ABUF-1>
	ADDI	BPREG,(REG2)
	CAIL	BPREG,<GBUF2+LBUFS>
	 JRST	DD$NER
	HRRZM	REG2,GBUF1(FLAG)
DD$NO1:	ILDB	REG3,REG1
	IDPB	REG3,REG2
	JUMPN	REG3,DD$NO1
	HRRZI	REG2,1(REG2)
	MOVEM	REG2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DD$NO2
	TSOUT	<CRLF>
DD$NO2:	TSOUT	<[ASCIZ /    /]>
	SOJGE	UTIL,DD$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IOREG," "
	 RETURN	SKIP,1
	AOJA	FLAG,DD$NIN
DD$NER:	TSOUT	<[ASCIZ / (Pathname too long.)/],CRLF>
	ENDR

; DGET -- GET-RETRIEVE (NETWORK TO LOCAL)
;
DGET:	BEGINR	<IOREG,UTIL>
	DCSOUT	<[ASCIZ /OPEN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ /LIST /],ABUF,[ASCIZ / %SOURCE/],SEMI>
	MOVE	UTIL,[440700,,GBUF1]
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I280/]
	 JRST	DGET3
	CALLR	RENLIN
DGET1:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 JRST	DGET4
	CAIE	IOREG,"*"
	 JRST	DGET1
DGET2:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 JRST	DGET4
	CAIN	IOREG,"*"
	 JRST	DGET3
	IDPB	IOREG,UTIL
	JRST	DGET2
DGET3:	CALLR	RENLIN
DGET4:	SETZ	IOREG,
	IDPB	IOREG,UTIL
	CALLR	RENDER
	 JRST	.+1
	CALLR	NETNI
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE5
; (((TOPS-10)))
IFE F.TENX,<
	CALLR	LOCDG
>
; (((↑↑↑)))
	CALLR	LOCOO
	 JRST	DGETE3
	DCSOUT	<[ASCIZ /"<PORT">=/],ABUF,SEMI>
	CALLR	NETOI
	 JRST	DGETE2
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I240/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I249/]
	 JRST	DGETE1
	CALLR	RENLIN
	TSOUT	<[ASCIZ / [OK]/],CRLF>
	CALLR	MOVNL
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I260/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I269/]
	 JRST	DGETE1
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	NETC
; (((TENEX)))
IFN F.TENX,<
	CALLR	LOCDG
>
; (((↑↑↑)))
	CALLR	LOCC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE3
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DGETE4
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGTT
	 CALLR	MOVR
	RETURN	SKIP,1
DGETE1:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
	CALLR	NETC
DGETE2:	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
DGETE3:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DGETE4:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DGETE5:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IOREG,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBUFS,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLIN0
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLIN0:	CAIE	IOREG,33
	 JRST	DLINE
	TSOUT	<CRLF>
DLINA:	TSOUT	<[ASCIZ /$/]>
	TSIN	(ANCHOR,SBUFS,[ASCIZ /$/])
	 JRST	DLINI
	TSOUT	<CRLF>
	JUMPE	UTIL,DLINA
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ /[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR

; DPUT -- PUT-STORE (LOCAL TO NETWORK)
;
DPUT:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
	CALLR	LOCOI
	 RETURN
	CALLR	LOCDP
	CALLR	LOCS
	JUMPG	UTIL,DPUT1
	TSOUT	<[ASCIZ / (Empty local file.)/],CRLF>
	JRST	DPUTE6
DPUT1:	CAMG	UTIL,[SIZPAG*SIZFIL]
	 JRST	DPUT2
	TSOUT	<[ASCIZ / (Local file too large.)/],CRLF>
	JRST	DPUTE6
DPUT2:	DCSOUT	<[ASCIZ /LIST /],PBUF,SEMI>
	CALLR	RENDER
	 JRST	DPUT3
	TAIN	<[ASCIZ / [Old File][Confirm]/]>
	 JRST	DPUTE6
	 JRST	DPUTE6
	DCSOUT	<[ASCIZ /DELETE /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE6
	JRST	DPUT4
DPUT3:	TSOUT	<[ASCIZ / [New File]/],CRLF>
	SKIPN	GBUF2
	 JRST	DPUT4
	DCSOUT	<[ASCIZ /LIST /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+2
	JRST	DPUT4
	DCSOUT	<[ASCIZ /CREATE /],GBUF2,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE6
	SETO	FLAG,
DPUT4:	DCSOUT	<[ASCIZ /CREATE /],PBUF,<[ASCIZ / FILE STRING (0,/]>>
	DCNOUT	<UTIL>
	DCSOUT	<<[ASCIZ \),B=36,S=BINARY /*\]>,GBUF1,[ASCIZ \*/\],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE5
	CALLR	NETNO
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE4
	DCSOUT	<ABUF,[ASCIZ /="<PORT">/],SEMI>
	CALLR	NETOO
	 JRST	DPUTE3
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I230/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I239/]
	 JRST	DPUTE1
	CALLR	RENLIN
	CALLR	MOVLN
	CALLR	NETC
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I250/]
	 JRST	DPUTE2
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I259/]
	 JRST	DPUTE2
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	LOCC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE7
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DPUTE7
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGTT
	 CALLR	MOVR
	RETURN	SKIP,1
DPUTE1:	CALL	NETC
DPUTE2:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
DPUTE3:	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUTE4:	DCSOUT	<[ASCIZ /DELETE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DPUTE5:	JUMPE	FLAG,DPUTE6
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 JRST	.+1
DPUTE6:	CALLR	LOCC
	RETURN
DPUTE7:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DELETE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	DCSOUT	<[ASCIZ /DELETE /],GBUF2,SEMI>
	CALLR	RENDER
	 RETURN
	ENDR

; DVER -- VERIFY EQUIVALENCE OF LOCAL AND REMOTE DATA
;
DVER:	BEGINR	<IOREG,UTIL>
	CALLR	LOCOI
	 RETURN
	DCSOUT	<[ASCIZ /OPEN /],PBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE6
	CALLR	NETNI
	DCSOUT	<[ASCIZ /CONNECT "<PORT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE5
	DCSOUT	<[ASCIZ /"<PORT">=/],ABUF,SEMI>
	CALLR	NETOI
	 JRST	DVERE2
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;J205/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I240/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I249/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	MOVV
	CALLR	RENPRE
	CAME	IOREG,[ASCII /.I260/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I269/]
	 JRST	DVERE1
	CALLR	RENLIN
	CALLR	MOVC
	CALLR	NETC
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE3
	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	DVERE4
	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
	RETURN	SKIP,1
DVERE1:	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CALLR	RENLIP
	CALLR	NETC
DVERE2:	CALLR	RENDER
	 JRST	.+1
DVERE3:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DVERE4:	DCSOUT	<[ASCIZ /DISCONNECT "<PORT">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
	CALLR	LOCC
	RETURN
DVERE5:	DCSOUT	<[ASCIZ /CLOSE /],ABUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	.+1
DVERE6:	CALLR	LOCC
	ENDR

; MOVC -- CHECKSUM TEST
;
MOVC:	BEGINR	<IOREG,FLAG>
	CALLR	RENPRE
	CAME	IOREG,[ASCII /;I275/]
	 JRST	MOVC2
	SETZ	FLAG,
MOVC1:	DCBIN	<IOREG>
	CAIE	IOREG,"="
	 JRST	MOVC1
	SKIPN	FLAG
	 SOJA	FLAG,MOVC1
	CALLR	DCNIN
	CAME	IOREG,MOVSUM
	 JRST	MOVC3
	CALLR	RENLIN
	RETURN
MOVC2:	CALLR	RENLIP
	RETURN
MOVC3:	TSOUT	<[ASCIZ / (Network Checksum Error.)/],CRLF>
	CALLR	RENLIN
	ENDR

; MOVR -- CALCULATE AND PRINT MOVE RATE
;
MOVR:	BEGINR	<IOREG,<IOREG+1>>
	TSOUT	<[ASCIZ / (/]>
	MOVEI	IOREG,↑D36
	IMULB	IOREG,MOVSPA
	IDIV	IOREG,MOVTIM
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ / Baud (/]>
	MOVE	IOREG,MOVSPA
	TNOUT	<IOREG>
	TSOUT	<[ASCIZ / bits in /]>
	MOVE	IOREG,MOVTIM
	CAIN	IOREG,0
	 MOVEI	IOREG,1
	TNOUT	<IOREG>
	HRRZI	<IOREG+1>,[ASCIZ / seconds))/]
	CAIN	IOREG,1
	 HRRZI	<IOREG+1>,[ASCIZ / second))/]
	TSOUT	<(IOREG+1),CRLF>
	ENDR

; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	FLAG,
RENDIL:	CALLR	RENPRE
	CAMN	IOREG,[ASCII /.I220/]
	 JRST	RENDES
	CAMN	IOREG,[ASCII /.I210/]
	 JRST	RENDRR
	LDB	UTIL,[350700,,IOREG]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIN	UTIL,"!"
	 JRST	RENDPM
	SKIPE	FLAGDE
	 JRST	RENDPT
RENDNM:	CALLR	RENLIN
	JRST	RENDIL
RENDPT:	SETZM	FLAGDE
	CAIN	UTIL,";"
	 JRST	RENDNM
	CAIN	UTIL,"."
	 JRST	RENDNM
RENDPM:	CALLR	RENLIP
	JRST	RENDIL
RENDES:	CALLR	RENLIN
	MOVEI	IOREG,"L"-100
	DCBOUT	<IOREG>
	AOJA	FLAG,RENDIL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IOREG>
RENLNL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IOREG>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IOREG>
	CAIE	IOREG,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IOREG>
	CAIN	IOREG,12
	 RETURN
	CAIE	IOREG,11
	 JRST	RENLPF
	MOVEI	IOREG," "
	TBOUT	<IOREG>
	MOVEI	IOREG,"("
RENLPP:	TBOUT	<IOREG>
	DCBIN	<IOREG>
	CAIE	IOREG,15
	 JRST	RENLPP
	DCBIN	<IOREG>
	MOVEI	IOREG,")"
	TBOUT	<IOREG>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IOREG -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BPREG,UTIL,FLAG>
	SETZ	IOREG,
	MOVE	BPREG,[440700,,IOREG]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	RENPRL
	CAIN	UTIL,12
	 JRST	RENPRL
	IDPB	UTIL,BPREG
	SOJG	FLAG,RENPRL
	ENDR

; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ / ?? FATAL DATACOMPUTER ERROR ??/],CRLF>
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFN F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))


; ***I/O ROUTINES***

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: REG1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IOREG>
	MOVEI	IOREG,(REG1)
	TSOUT	<(IOREG)>
TAIN1:	TBIN	<IOREG>
	CAIN	IOREG,15
	 JRST	TAIN1
	CAIN	IOREG,177
	 JRST	TAIN2
	CAIN	IOREG,"N"
	 JRST	TAIN3
	CAIN	IOREG,"Y"
	 JRST	TAIN4
	CAIN	IOREG,12
	 JRST	TAIN5
	CAIN	IOREG,33
	 JRST	TAIN5
	CAIN	IOREG,37
	 JRST	TAIN5
	CAIN	IOREG," "
	 JRST	TAIN5
	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TAIN1
TAIN2:	TSOUT	<[ASCIZ /XXX/],CRLF>
	RETURN
TAIN3:	TSOUT	<[ASCIZ /No/],CRLF>
	RETURN	SKIP,1
TAIN4:	TSOUT	<[ASCIZ /Yes/]>
TAIN5:	TSOUT	<CRLF>
	ENDR	SKIP,2

; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A DELETES THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND RUBOUT DELETES THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[440700,,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIN	TCIO,"A"-100
	 JRST	TCIDEL
	CAIN	TCIO,"X"-100
	 JRST	TCIENR
	CAIN	TCIO,177
	 JRST	TCIENR
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIN	TCIO,12
	 JRST	TCIC01
	CAIN	TCIO,37
	 JRST	TCIC01
	CAIN	TCIO," "
	 JRST	TCIC01
	CAIN	TCIO,33
	 JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	AOJ	TCIMAC,
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	JRST	TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIN	TCIO,12
	 JRST	TCIC09
	CAIN	TCIO,37
	 JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[440700,,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIBAD	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	SOJ	TCIBP,		; FIX LINE BYTE PTR
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	IBP	TCIBP
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	SOJ	TCISBP,		; FIX SCAN BYTE PTR
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	IBP	TCISBP
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2

; TERMINAL STRING INPUT
;   IN: IOREG -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IOREG -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BPREG,R10,R11,R12>
	MOVE	R10,IOREG
	MOVE	R11,UTIL
	HLR	BPREG,IOREG
	HRLI	BPREG,440700
	SETZ	UTIL,
TSICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TSIREP
	CAIN	IOREG,"A"-100
	 JRST	TSIDEL
	CAIN	IOREG,"X"-100
	 JRST	TSIENR
	CAIN	IOREG,177
	 JRST	TSIENR
	CAIN	IOREG,15
	 JRST	TSICHR
	CAIN	IOREG,12
	 JRST	TSIEND
	CAIN	IOREG,33
	 JRST	TSIEND
	CAIN	IOREG,37
	 JRST	TSIEND
	CAIGE	IOREG," "
	 JRST	TSIBAD
	CAIL	UTIL,(R10)
	 JRST	TSIBAD
	IDPB	IOREG,BPREG
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IOREG,(BPREG)
	HLR	R12,R10
	CAIGE	IOREG,(R12)
	 JRST	TSICHR
	HRLI	R12,440700
TSIR01:	CAMN	R12,BPREG
	 JRST	TSICHR
	ILDB	IOREG,R12
	TBOUT	<IOREG>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IOREG>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETO	IOREG,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BPREG
	ENDR	SKIP,1

; TERMINAL NUMBER INPUT
;   IN: IOREG -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IOREG -- NUMBER
;
$TNIN$:	BEGINR	<BPREG,UTIL,FLAG>
	MOVE	UTIL,IOREG
	MOVE	BPREG,[440700,,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IOREG>
	CAIN	IOREG,"R"-100
	 JRST	TNIREP
	CAIN	IOREG,"A"-100
	 JRST	TNIDEL
	CAIN	IOREG,"X"-100
	 JRST	TNIENR
	CAIN	IOREG,177
	 JRST	TNIENR
	CAIN	IOREG,15
	 JRST	TNICHR
	CAIN	IOREG,12
	 JRST	TNIEND
	CAIN	IOREG,33
	 JRST	TNIEND
	CAIN	IOREG,37
	 JRST	TNIEND
	CAIN	IOREG," "
	 JRST	TNIEND
	CAIGE	IOREG,"0"
	 JRST	TNIBAD
	CAIL	IOREG,"0"(UTIL)
	 JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IOREG,BPREG
	TBOUT	<IOREG>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IOREG,"G"-100
	TBOUT	<IOREG>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IOREG,UTIL
	TSOUT	<(IOREG)>
	HRRZI	IOREG,(BPREG)
	CAIGE	IOREG,UBUF1
	 JRST	TNICHR
	MOVE	IOREG,[440700,,UBUF1]
TNIR01:	CAMN	IOREG,BPREG
	 JRST	TNICHR
	ILDB	REG1,IOREG
	TBOUT	<REG1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIBAD
	MOVEI	IOREG,"\"
	TBOUT	<IOREG>
	LDB	IOREG,BPREG
	SOJ	BPREG,
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	IBP	BPREG
	TBOUT	<IOREG>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ /XXX/],CRLF>
	SETZ	IOREG,
	RETURN
TNIEND:	SETZ	IOREG,
	IDPB	IOREG,BPREG
	MOVE	BPREG,[440700,,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(1)
	IMULI	IOREG,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IOREG,(UTIL)
	JRST	TNICAL
	ENDR

; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IOREG -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IOREG+1>,UTIL>
	SETZ	IOREG,
DCNIN1:	DCBIN	<UTIL>
	CAIGE	UTIL,"0"
	 RETURN
	CAILE	UTIL,"9"
	 RETURN
	JUMPL	IOREG,DCNIN2
	MULI	IOREG,↑D10
	CAILE	IOREG,1
	 JRST	DCNIN2
	CAIN	IOREG,1
	 TLO	<IOREG+1>,400000
	MOVE	IOREG,<IOREG+1>
	ADDI	IOREG,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IOREG,
	JRST	DCNIN1
	ENDR

; $NOUT$ -- INTEGER OUTPUT
;   IN: REG1 -- INTEGER
;       REG2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,REG2
	MOVE	REG3,[440700,,UBUF1]
	MOVEI	REG4,1
	JUMPGE	REG1,NOUT1
	LSHC	REG1,-↑D35
	LSH	REG2,-1
	DIVI	REG1,(FLAG)
	JRST	.+2
NOUT1:	IDIVI	REG1,(FLAG)
	ADDI	REG2,60
	IDPB	REG2,REG3
	SKIPE	REG1
	 AOJA	REG4,NOUT1
	MOVE	REG1,[440700,,UBUF2]
NOUT2:	LDB	REG2,REG3
	IDPB	REG2,REG1
	SOJ	REG3,
	IBP	REG3
	IBP	REG3
	IBP	REG3
	IBP	REG3
	SOJG	REG4,NOUT2
	IDPB	REG4,REG1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR


; ***SYSTEM DEPENDENT ROUTINES***

; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	CALLR	ICP
	ENDR

; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IOREG,UTIL,FLAG>
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IOREG,LINP		; LISTEN ON INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	.+2
	JRST	ICPICP
	MOVE	IOREG,DCIBLK+.IBERR
	CAIE	IOREG,.IESKT
	 JRST	ICPEIL
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	REG4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	REG3,
	SETZ	FLAG,
ICPRDV:	MOVE	IOREG,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IOREG,WRKBLK+.IBDEV
	MOVEI	REG1,(REG3)
	IDIVI	REG1,10
	JUMPE	REG1,ICPRD1
	ADDI	REG1,20
	ADDI	REG2,20
	DPB	REG1,[140600,,WRKBLK+.IBDEV]
	DPB	REG2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	REG2,20
	DPB	REG2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IOREG,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD3
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	REG2,(REG1)
	 JRST	ICPRD3
	MOVE	IOREG,WRKBLK+.IBLCL
	CAMN	IOREG,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IOREG,2
	CAMN	IOREG,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IOREG,1			; OUTPUT DATA SOCKET
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IOREG,WRKBLK+.IBHST
	CAIE	IOREG,DCHOST
	 JRST	ICPRD4
	PJOB	REG1,
	HLRZ	REG2,WRKBLK+.IBSTT
	CAIE	REG2,(REG1)
	 JRST	ICPRD4
	MOVE	IOREG,WRKBLK+.IBLCL
	SUBI	IOREG,3
	CAMN	IOREG,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	REG3,1
	CAIGE	REG3,(REG4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	TTCALL	3,[ASCIZ / (Connections in use.)/]
	EXIT
ICPCLS:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IOREG,1
	MOVEM	IOREG,WRKBLK+.IBLCL
	MOVE	IOREG,SWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Retrieve interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IOREG,CWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	TTCALL	3,[ASCIZ / (Store interrupted:  connection closed.)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IOREG,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IOREG,DCCHAS+1
	MOVE	IOREG,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IOREG,OICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IOREG,ICCHAS+1
	OPEN	DCCHAN,ICCHAS		; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 JRST	.+2
	JRST	ICPET
	MOVE	IOREG,ICPBUF+1
	MOVE	IOREG,1(IOREG)		; GET THE SOCKET NUMBER
	LSH	IOREG,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IOREG,DCOBLK+.IBRMT
	AOJ	IOREG,
	MOVEM	IOREG,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IOREG,OINP		; OPEN INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IOREG,OOUT		; OPEN OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
	MOVE	IOREG,PWRK
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IOREG,WRKBLK+.IBHST
	MOVEM	IOREG,LHOST
	ENDR

; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IOREG,"Z"-100
	IDPB	IOREG,DCOBUF+1
	OUT	DCCHAN,
	 JRST	.+1
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPN	FLAGDD
	 JRST	QUIT01
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	MOVE	IOREG,COUT		; CLOSE OUTPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
QUIT04:	MOVE	IOREG,CINP		; CLOSE INPUT SOCKET
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	RESET
	EXIT

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,104
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCIBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
NETOI2:	TTCALL	3,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	SETZM	DCDBLK+.IBDEV
	MOVEI	REG1,105
	MOVEM	REG1,DCDBLK+.IBLCL
	MOVE	REG1,DCOBLK+.IBRMT
	ADDI	REG1,2
	MOVEM	REG1,DCDBLK+.IBRMT
	MOVE	REG1,ODAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	REG1,DCDBLK+.IBDEV
	MOVEM	REG1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
NETOO2:	TTCALL	3,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	RELEAS	DDCHAN,
	MOVE	REG1,CDAT
	CALL	REG1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	TTCALL	3,[ASCIZ / ?? NETWORK CONNECTION CLOSE FAILURE ??
/]
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;   OUT: UTIL
;
NETNI:	BEGINR
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;   OUT: UTIL
;
NETNO:	BEGINR
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105
	ENDR

; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 JRST	.+2
	JRST	NETEIT
	SKIPN	FLAGDD
	 RETURN
	HRRZ	REG1,DCIBUF
	CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: REG1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IOREG,BPREG>
	MOVEI	BPREG,(REG1)
	HRLI	BPREG,440700
NUTMOL:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	SKIPE	DCOBUF+2
	 JRST	NUTMOB
	SKIPN	FLAGDD
	 JRST	NUTMOO
	HRRZ	REG1,DCOBUF
	CALLR	NUTDD
NUTMOO:	OUT	DCCHAN,
	 JRST	.+2
	JRST	NETEOT
NUTMOB:	SOS	DCOBUF+2
	IDPB	IOREG,DCOBUF+1
	JRST	NUTMOL
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;   IN: REG1 -- POINTER TO BUFFER HEADER
;
NUTDD:	BEGINR	<IOREG,UTIL>
	HLRZ	UTIL,(REG1)
	ADDI	REG1,2
	HRLI	REG1,440700
	TRZ	UTIL,400000
	SUBI	UTIL,1
	IMULI	UTIL,5
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IOREG,REG1
	JUMPE	IOREG,RETN(0)
	TTCALL	1,IOREG
	JRST	NUTDDL
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
ICPERD:	TTCALL	3,[ASCIZ / ?? RESTART FAILURE ??/]
	EXIT
ICPEIL:	TTCALL	3,[ASCIZ / ?? INPUT SOCKET LISTEN FAILURE ??/]
	EXIT
ICPEOL:	TTCALL	3,[ASCIZ / ?? OUTPUT SOCKET LISTEN FAILURE ??/]
	JRST	QUIT04
ICPET:	TTCALL	3,[ASCIZ / ?? ICP FAILURE (TRANSFER) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	TTCALL	3,[ASCIZ / ?? ICP FAILURE (FILE CONTROL) ??/]
	JRST	ICPEZ
ICPEC:	TTCALL	3,[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 TTCALL	3,[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 TTCALL	3,[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 TTCALL	3,[ASCIZ / (timeout)/]
	TTCALL	3,[ASCIZ /.
/]
	MOVE	IOREG,CICP
	CALL	IOREG,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	TTCALL	3,[ASCIZ / ?? INPUT FAILURE (CONNECTION) ??/]
	EXIT
NETEOC:	TTCALL	3,[ASCIZ / ?? OUTPUT FAILURE (CONNECTION) ??/]
	JRST	QUIT04
NETECF:	TTCALL	3,[ASCIZ / ?? FILE CONTROL FAILURE ??/]
	JRST	QUIT03
NETEIT:	TTCALL	3,[ASCIZ / ?? INPUT FAILURE (TRANSFER) ??/]
	JRST	QUIT
NETEOT:	TTCALL	3,[ASCIZ / ?? OUTPUT FAILURE (TRANSFER) ??/]
	JRST	QUIT

OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
	LOOKUP	LFCHAN,LFILE	; PREPARE FILE FOR INPUT
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	TTCALL	3,[ASCIZ / ?? LOCAL CHANNEL OPEN FAILURE ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	TTCALL	3,[ASCIZ / (Local file not found.)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IOREG,<IOREG+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IOREG,<LFILE+1>
	MOVE	<IOREG+1>,<LFILE+2>
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	.+3
	 JRST	.+2
	JRST	LOCOO1
	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IOREG,<LFILE+1>
	MOVEM	<IOREG+1>,<LFILE+2>
	ENTER	LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	TTCALL	3,[ASCIZ / ?? LOCAL FILE CREATION FAILURE ??
/]
	RELEAS	LFCHAN,
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: UTIL -- SIZE IN WORDS
;
LOCS:	BEGINR
	SKIPL	LFILE+3
	 JRST	LOCS1
	HLRO	UTIL,LFILE+3	; SIZE IN WORDS
	MOVN	UTIL,UTIL
	RETURN
LOCS1:	HLRZ	UTIL,LFILE+3	; SIZE IN BLOCKS
	IMULI	UTIL,SIZBLK
	ENDR

; LOCDG -- LOCAL FILE CREATION DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<BPREG,UTIL>
	MOVE	BPREG,[440700,,GBUF1]
	ILDB	UTIL,BPREG
	JUMPE	UTIL,RETN(0)
	CAIN	UTIL," "
	 MOVEI	UTIL,"0"
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	MOVE	REG2,[440700,,REG3]
	SETZ	REG3,
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	ILDB	UTIL,BPREG
	IDPB	UTIL,REG2
	MOVEI	REG2,↑D11
	CAMN	REG3,LOCDM(REG2)
	 JRST	.+3
	SOJGE	REG2,.-2
	RETURN
	ILDB	UTIL,BPREG
	CAIE	UTIL,"-"
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG3,-"0"(UTIL)
	IMULI	REG3,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG3,-"0"(UTIL)
	SUBI	REG3,↑D64
	IMULI	REG3,↑D12
	ADDI	REG3,(REG2)
	IMULI	REG3,↑D31
	ADDI	REG3,-1(REG1)
	ILDB	UTIL,BPREG
	CAIE	UTIL," "
	 RETURN
	ILDB	UTIL,BPREG
	MOVEI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,6
	ILDB	UTIL,BPREG
	CAIE	UTIL,":"
	 RETURN
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	IMULI	REG1,↑D10
	ILDB	UTIL,BPREG
	ADDI	REG1,-"0"(UTIL)
	DPB	REG3,[001400,,LFILE+2]
	LSH	REG3,-14
	DPB	REG3,[170300,,LFILE+1]
	DPB	REG1,[141300,,LFILE+2]
	ENDR

; LOCDP -- LOCAL FILE CREATION DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,[440700,,GBUF1]
	LDB	REG2,[001400,,LFILE+2] ; CREATION DATE
	LDB	REG3,[170300,,LFILE+1]
	LSH	REG3,14
	IORI	REG2,(REG3)
	IDIVI	REG2,↑D31
	MOVEI	REG4,(REG2)
	MOVEI	REG2,1(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	CAIN	REG2,"0"
	 MOVEI	REG2," "
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D12
	MOVEI	REG4,(REG2)
	HRRI	REG2,LOCDM(REG3)
	HRLI	REG2,440700
	SCOPY	(REG2,REG1)
	MOVEI	REG2,"-"
	IDPB	REG2,REG1
	MOVEI	REG2,↑D64(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2," "
	IDPB	REG2,REG1
	LDB	REG2,[141300,,LFILE+2] ; CREATION TIME
	IDIVI	REG2,↑D60
	MOVEI	REG4,(REG3)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	MOVEI	REG2,":"
	IDPB	REG2,REG1
	MOVEI	REG2,(REG4)
	IDIVI	REG2,↑D10
	ADDI	REG2,"0"
	ADDI	REG3,"0"
	IDPB	REG2,REG1
	IDPB	REG3,REG1
	SETZ	REG2,
	IDPB	REG2,REG1
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LOCDM:	ASCII	/JAN/
	ASCII	/FEB/
	ASCII	/MAR/
	ASCII	/APR/
	ASCII	/MAY/
	ASCII	/JUN/
	ASCII	/JUL/
	ASCII	/AUG/
	ASCII	/SEP/
	ASCII	/OCT/
	ASCII	/NOV/
	ASCII	/DEC/

; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IOREG -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IOREG,BPREG,UTIL>
	HRRI	BPREG,(IOREG)
	HRLI	BPREG,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
	SETZM	LFILE+3
	MOVEI	REG1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	REG2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IOREG,BPREG
	JUMPE	IOREG,RETN(0)
	CAIN	IOREG,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IOREG,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IOREG,77	;   AND REMOVAL OF HIGH BITS
	XCT	(REG1)		; EXECUTE THE PROPER ROTATE
	IORM	IOREG,(REG2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	REG1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	REG2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	REG1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	REG2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IOREG,-6	; HIGH ORDER
	ROT	IOREG,-14
	ROT	IOREG,22
	ROT	IOREG,14
	ROT	IOREG,6
	ROT	IOREG,0		; LOW ORDER
	ENDR

; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
	MOVE	REG1,LUTDSP
	SKIPN	(REG1)
	 JRST	LUTDSI
LUTDS1:	MOVNI	REG2,2
	ADDM	REG2,LDIBUF+2
	SKIPGE	LDIBUF+2
	 JRST	LUTDSI
	MOVE	REG3,[440700,,ABUF]
	HRLI	REG1,440600
	MOVEI	REG2,6
LUTDS2:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS3
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS2
LUTDS3:	ADDI	REG1,1
	LDB	REG4,[222200,,(REG1)]
	JUMPE	REG4,LUTDS5
	MOVEI	REG4,"."
	IDPB	REG4,REG3
	HRLI	REG1,440600
	MOVEI	REG2,3
LUTDS4:	ILDB	REG4,REG1
	JUMPE	REG4,LUTDS5
	ADDI	REG4,40
	IDPB	REG4,REG3
	SOJG	REG2,LUTDS4
LUTDS5:	SETZ	REG4,
	IDPB	REG4,REG3
	ADDI	REG1,1
	HRRZM	REG1,LUTDSP
	RETURN	SKIP,1
LUTDSS:	RELEAS	LDCHAN,
	GETPPN	REG1,
	MOVEM	REG1,LDIR
	MOVE	REG1,[SIXBIT/UFD/]
	MOVEM	REG1,LDIR+1
	SETZM	LDIR+2
	MOVE	REG1,[1,,1]
	MOVEM	REG1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSE
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	TTCALL	3,[ASCIZ / (No local files.)
/]
	RELEAS	LDCHAN,
	RETURN
LUTDSI:	IN	LDCHAN,
	 JRST	.+2
	JRST	LUTDSD
	HRRZ	REG1,LDIBUF
	ADDI	REG1,2
	SKIPE	(REG1)
	 JRST	LUTDS1
	RELEAS	LDCHAN,
	RETURN
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 TTCALL	3,[ASCIZ / ?? LOCAL DIRECTORY FAILURE ??
/]
	RELEAS	LDCHAN,
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR	<UTIL>
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	SETZM	MOVSUM
	CALLR	LOCS
	MOVEM	UTIL,MOVSPA
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVLN1:	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVLN2
	HRR	REG1,LFIBUF
	HRLI	REG1,2(REG1)
	HRR	REG2,DDOBUF
	HRRI	REG1,2(REG2)
	BLT	REG1,<2+200-1>(REG2)
	MOVE	REG1,LFIBUF+2
	ADDM	REG1,DDOBUF+1
	OUT	DDCHAN,
	 JRST	.+2
	THUD
	HRRZ	REG2,LFIBUF
	ADDI	REG1,1(REG2)
	ADDI	REG2,2
	SETZ	REG3,
	ADD	REG3,(REG2)
	CAIGE	REG2,(REG1)
	 AOJA	REG2,.-2
	ADDM	REG3,MOVSUM
	JRST	MOVLN1
MOVLN2:	STATO	LFCHAN,20000
	 THUD
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	SETZM	LFOBUF+2	; COUNT: # WORDS USED (REVERSE TOPS-10)
	SETZM	MOVSUM
	SETZM	MOVSPA
	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVEM	REG1,MOVTIM
MOVNL1:	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVNL4
	MOVE	REG1,DDIBUF+2
	ADD	REG1,LFOBUF+2
	CAIL	REG1,200
	 JRST	MOVNL2
	HRR	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF+1
	AOJ	REG2,
	HRRZ	REG1,LFOBUF+1
	ADD	REG1,DDIBUF+2
	BLT	REG2,(REG1)
	MOVE	REG1,DDIBUF+2
	ADDM	REG1,LFOBUF+1
	ADDM	REG1,LFOBUF+2
	JRST	MOVNL3
MOVNL2:	HRRZI	REG3,-200(REG1)
	MOVEI	REG4,200
	SUB	REG4,LFOBUF+2
	HRR	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF+1
	AOJ	REG2,
	MOVE	REG1,LFOBUF
	ADDI	REG1,<2+200-1>
	BLT	REG2,(REG1)
	HRRM	REG1,LFOBUF+1
	OUT	LFCHAN,
	 JRST	.+2
	THUD
	SETZM	LFOBUF+2
	JUMPE	REG3,MOVNL3
	MOVEM	REG3,LFOBUF+2
	ADDM	REG3,LFOBUF+1
	HRRZI	REG2,(REG4)
	ADD	REG2,DDIBUF
	HRLI	REG2,2(REG2)
	HRR	REG2,LFOBUF
	ADDI	REG2,2
	BLT	REG2,@LFOBUF+1
MOVNL3:	MOVE	REG1,DDIBUF+2
	ADDM	REG1,MOVSPA
	HRRZ	REG2,DDIBUF
	ADDI	REG1,1(REG2)
	ADDI	REG2,2
	SETZ	REG3,
	ADD	REG3,(REG2)
	CAIGE	REG2,(REG1)
	 AOJA	REG2,.-2
	ADDM	REG3,MOVSUM
	JRST	MOVNL1
MOVNL4:	STATO	DDCHAN,20000
	 THUD
	SKIPN	LFOBUF+2
	 JRST	MOVNL5
	OUT	LFCHAN,
	 JRST	MOVNL5
	THUD
MOVNL5:	MSTIME	REG1,
	IDIVI	REG1,↑D1000
	MOVE	REG2,MOVTIM
	CAMGE	REG1,REG2
	 ADDI	REG1,<↑D24*↑D60*↑D60>
	SUB	REG1,REG2
	MOVEM	REG1,MOVTIM
	ENDR

; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	UTIL,
	SETZ	FLAG,
	SETZM	MOVSUM
	IN	DDCHAN,
	 JRST	.+2
	THUD
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV4
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	SKIPLE	LFIBUF+2
	 JRST	.+4
	IN	LFCHAN,
	 JRST	.+2
	JRST	MOVV2
	SOS	LFIBUF+2
	AOS	LFIBUF+1
	MOVE	IOREG,@<LFIBUF+1>
	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV5
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	CAMN	IOREG,REG1
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	STATO	LFCHAN,20000
	 THUD
	SKIPLE	DDIBUF+2
	 JRST	MOVV4
	IN	DDCHAN,
	 JRST	MOVV4
	STATO	DDCHAN,20000
	 THUD
	JUMPN	FLAG,MOVV3
	TTCALL	3,[ASCIZ / [OK]
/]
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+3
	TTCALL	3,[ASCIZ / (There is one different word at /]
	JRST	MOVV03
	TTCALL	3,[ASCIZ / (There are /]
	TNOUT	<FLAG>
	TTCALL	3,[ASCIZ / different words, with the first difference at /]
MOVV03:	TNOUT	<UTIL>
	TTCALL	3,[ASCIZ /.)
/]
	RETURN
MOVV4:	SKIPLE	DDIBUF+2
	 JRST	.+4
	IN	DDCHAN,
	 JRST	.+2
	JRST	MOVV04
	SOS	DDIBUF+2
	AOS	DDIBUF+1
	MOVE	REG1,@<DDIBUF+1>
	ADDM	REG1,MOVSUM
	JRST	MOVV4
MOVV04:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	RETURN
MOVV5:	STATO	DDCHAN,20000
	 THUD
	TTCALL	3,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	ENDR
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	REG1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	REG1,-1
	RFMOD
	TRZ	REG2,006000	; (1B24+1B25)
	SFMOD
	MOVE	REG2,[052531,,513125] ; ↑G'S, TAB'S, LF'S, CR'S
	MOVE	REG3,[252525,,253000] ;   AND EOL'S (NO NULLS)
	SFCOC
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	REG1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	REG1,400000	; FOR THIS FORK
	MOVE	REG2,[1B0+1B10+1B15] ; TTY, EOF, ILI
	AIC			; ACTIVATE CHANNELS
	CALLR	ICP
	ENDR

; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:20./]
	SETZ	REG3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JRST	.+1		; CVHST SUCCESS OR NOUT FAILURE
	MOVN	REG2,DCSOCK
	NOUT
	 JRST	.+1
	HRLZI	REG1,1	; SHORT GTJFN
	HRROI	REG2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	REG2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	REG2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:22./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	REG1,DCOJFN
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	REG1,DCIJFN
	MOVE	REG2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	REG1,DCOJFN
	MOVE	REG2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	REG1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	REG1,LHOST
	ENDR

; NETWORK QUIT
;
QUIT:	MOVE	REG1,DCOJFN
	MOVEI	REG2,"Z"-100
	BOUT
	MOVEI	REG2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IOREG>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:24./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,3
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	REG1,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	REG1,[440700,,UBUF1]
	HRROI	REG2,[ASCIZ /NET:25./]
	SETZ	REG3,
	SOUT
	MOVEI	REG2,DCHOST
	MOVEI	REG3,10
	CVHST
	 NOUT
	 JRST	.+1
	MOVN	REG2,ICPSOC
	SUBI	REG2,2
	NOUT
	 JRST	.+1
	HRLZI	REG1,1
	HRROI	REG2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	REG1,DCDJFN
	MOVE	REG2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	REG1,[ASCIZ / ?? NETWORK CONNECTION OPEN FAILURE ??
/]
	PSOUT
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	REG1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ / ?? NETWORK CONNECTION CLOSE FAILURE ??
/]
	PSOUT
	ENDR

; NETNI -- NETWORK: NUMBER OF INPUT SOCKET
;   OUT: UTIL
;
NETNI:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETNO -- NETWORK: NUMBER OF OUTPUT SOCKET
;   OUT: UTIL
;
NETNO:	BEGINR
	GJINF
	HRRZI	UTIL,(REG2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR

; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	REG1,[ASCIZ / The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	REG1,[ASCIZ / ?? ICP CLOSF FAILURE ??/]
	JRST	NETEQ
ICPEOG:	HRROI	REG1,[ASCIZ / ?? ICP OUTPUT GTJFN FAILURE ??/]
	JRST	NETEQ
ICPEIG:	HRROI	REG1,[ASCIZ / ?? ICP INPUT GTJFN FAILURE ??/]
	JRST	NETEQ
ICPEIO:	HRROI	REG1,[ASCIZ / ?? ICP OUTPUT OPENF FAILURE ??/]
	JRST	NETEQ
ICPEOO:	HRROI	REG1,[ASCIZ / ?? ICP INPUT OPENF FAILURE ??/]
	JRST	NETEQ

; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	REG1,100001	; OLD FILE, SHORT CALL
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOI1
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	REG1,[ASCIZ / (Local file not found.)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	REG1,[ASCIZ / (Local file not available.)
/]
	PSOUT
	MOVE	REG1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	REG1,600001	; VN, WRITE, SHORT
	MOVE	REG2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOO2
	HRRZM	REG1,LJFN
	MOVE	REG2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	MOVE	REG1,LJFN
	RLJFN
	 JRST	.+1
LOCOO2:	HRROI	REG1,[ASCIZ / ?? LOCAL FILE CREATION FAILURE ??
/]
	PSOUT
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	MOVE	REG1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	REG1,[ASCIZ / ?? LOCAL FILE CLOSE FAILURE ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: UTIL -- SIZE IN WORDS
;
LOCS:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	REG3,UBUF1
	GTFDB
	 JRST	.+3
	SETZ	UTIL,
	RETURN
	LDB	REG1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	REG2,↑D36
	IDIVI	REG2,(REG1)	; BYTES/WD
	MOVE	REG3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	REG3,-1(REG2)	; ACCOUNT FOR TRUNCATION
	IDIVI	REG3,(REG2)	; NUMBER OF WORDS
	MOVE	UTIL,REG3
	ENDR

; LOCDG -- LOCAL FILE WRITE DATE (AND TIME) GET (FROM DATACOMPUTER)
;
LOCDG:	BEGINR	<IOREG,UTIL>
	HRROI	REG1,GBUF1
	SETZ	REG2,
	IDTIM
	 RETURN
	MOVE	IOREG,REG2
	MOVEI	REG1,400000	; FOR THIS FORK
	RPCAP
	TRNN	REG2,600000	; (1B18+1B19) WHEEL OR OPER
	 RETURN
	MOVE	UTIL,REG3
	TRO	REG3,(REG2)
	EPCAP			; ENABLE (!)
	HRR	REG1,LJFN
	HRLI	REG1,14		; OFFSET 14 (LAST WRITE)
	SETO	REG2,
	MOVE	REG3,IOREG
	CHFDB
	 JRST	.+1
	MOVEI	REG1,400000
	MOVE	REG3,UTIL
	EPCAP			; RESET CAPABILITIES
	ENDR

; LOCDP -- LOCAL FILE WRITE DATE (AND TIME) PUT (TO DATACOMPUTER)
;
LOCDP:	BEGINR
	MOVE	REG1,LJFN
	MOVE	REG2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	REG3,GBUF1
	GTFDB
	 JRST	.+3
	SETZM	GBUF1
	RETURN
	HRROI	REG1,GBUF1
	MOVE	REG2,GBUF1
	SETZ	REG3,
	ODTIM
	ENDR

; MOVLN -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
MOVLN:	BEGINR	<IOREG,UTIL>
	SETZM	MOVSUM
	CALLR	LOCS
	MOVEM	UTIL,MOVSPA
	MOVN	IOREG,UTIL
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVLN1:	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SIN
	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	CAMGE	REG3,IOREG
	 MOVE	REG3,IOREG
	SOUT
	MOVN	UTIL,IOREG
	CAILE	UTIL,SIZPAG
	 MOVEI	UTIL,SIZPAG
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
	ADDI	IOREG,SIZPAG
	JUMPL	IOREG,MOVLN1
	MOVE	REG1,DCDJFN
	MOVEI	REG2,21
	MTOPR
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; MOVNL -- MOVE DATA: NETWORK TO LOCAL (GET)
;
MOVNL:	BEGINR	<UTIL>
	SETOM	FLAGEF
	SETZM	MOVSUM
	SETZM	MOVSPA
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVEM	REG3,MOVTIM
MOVNL1:	MOVE	REG1,DCDJFN
	MOVE	REG2,[444400,,PAGE]
	MOVNI	REG3,SIZPAG
	SIN
	MOVE	REG1,LJFN
	MOVE	REG2,[444400,,PAGE]
	ADDI	REG3,SIZPAG	; WORDS RECEIVED
	JUMPE	REG3,MOVNL2
	MOVEI	UTIL,(REG3)
	MOVNI	REG3,(REG3)
	SOUT
	ADDM	UTIL,MOVSPA
	SETZ	REG1,
	ADD	REG1,<PAGE-1>(UTIL)
	SOJG	UTIL,.-1
	ADDM	REG1,MOVSUM
MOVNL2:	SKIPE	FLAGEF
	 JRST	MOVNL1
	MOVNI	REG1,5
	RUNTM
	IDIV	REG3,REG2
	MOVE	REG2,MOVTIM
	SUB	REG3,REG2
	MOVEM	REG3,MOVTIM
	ENDR

; VERIFY (WORD-BY-WORD COMPARE)
;
MOVV:	BEGINR	<IOREG,UTIL,FLAG>
	SETZ	UTIL,
	SETZ	FLAG,
	SETOM	FLAGEF
	SETZM	MOVSUM
MOVV1:	CAIN	FLAG,0
	 ADDI	UTIL,1
	MOVE	REG1,LJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV2
	MOVE	IOREG,REG2
	MOVE	REG1,DCDJFN
	BIN
	SKIPN	FLAGEF
	 JRST	MOVV5
	ADDM	REG2,MOVSUM
	CAMN	IOREG,REG2
	 JRST	MOVV1
	AOJA	FLAG,MOVV1
MOVV2:	SETOM	FLAGEF
	MOVE	REG1,DCDJFN
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	JUMPN	FLAG,MOVV3
	HRROI	REG1,[ASCIZ / [OK]
/]
	PSOUT
	RETURN
MOVV3:	CAIE	FLAG,1
	 JRST	.+4
	HRROI	REG1,[ASCIZ / (There is one different word at /]
	PSOUT
	JRST	MOVV03
	HRROI	REG1,[ASCIZ / (There are /]
	PSOUT
	TNOUT	<FLAG>
	HRROI	REG1,[ASCIZ / different words, with the first difference at /]
	PSOUT
MOVV03:	TNOUT	<UTIL>
	HRROI	REG1,[ASCIZ /.)
/]
	PSOUT
	RETURN
MOVV4:	ADDM	REG2,MOVSUM
	BIN
	SKIPE	FLAGEF
	 JRST	MOVV4
	HRROI	REG1,[ASCIZ / (The datacomputer file is larger than the local file.)
/]
	PSOUT
	RETURN
MOVV5:	HRROI	REG1,[ASCIZ / (The local file is larger than the datacomputer file.)
/]
	PSOUT
	ENDR

; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	HRROI	REG1,[ASCIZ / ?? UNEXPECTED EOF AT /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSI:	HRRZ	REG1,PSIPC1
	MOVE	REG2,-1(REG1)
	CAMN	REG2,[GTFDB]
	 JRST	ILIPSD
	CAMN	REG2,[CHFDB]
	 JRST	ILIPSD
	HRROI	REG1,[ASCIZ / ?? ILLEGAL INSTRUCTION AT /]
	CAMN	REG2,[-1]
	 HRROI	REG1,[ASCIZ / ?? IMPOSSIBLE EVENT AT /]
	PSOUT
	MOVEI	REG1,101
	HRRZ	REG2,PSIPC1
	SUBI	REG2,1
	MOVEI	REG3,10
	SETZ	REG4,
	NOUT
	 JRST	.+1
	HRROI	REG1,[ASCIZ / ??
/]
	PSOUT
	HALTF
	JRST	.-1
ILIPSD:	HRROI	REG1,[ASCIZ / (Bad local device.)
/]
	PSOUT
	AOS	PSIPC1
	DEBRK		; RETURN FROM INTERRUPT
>
; (((↑↑↑)))


; ***DATA***

CRLF:	BYTE	(7)15,12,0,0,0
SEMI:	BYTE	(7)73,15,12,0,0

HOSTS:	11,,[ASCIZ /HARVARD/]
	37,,[ASCIZ /CCA/]
	53,,[ASCIZ /OFFICE"-1/]
	55,,[ASCIZ /SCI/]
	56,,[ASCIZ /RUTGERS/]
	61,,[ASCIZ /BBN/]		; TENEXB
	70,,[ASCIZ /SUMEX/]
	102,,[ASCIZ /AIC/]
	126,,[ASCIZ /ISI/]		; ISI
	162,,[ASCIZ /BBN/]		; TENEXD
	226,,[ASCIZ /ISI/]		; ISIC
	305,,[ASCIZ /BBN/]		; TENEXA
	326,,[ASCIZ /ISI/]		; ISID
	361,,[ASCIZ /BBN/]		; TENEXC
	364,,[ASCIZ /ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE

; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

LFILE:	0			; LOCAL FILE NAME
	0			; EXTENSION
	0			; PROTECTION AND CREATION DATE
	0			; PROJ-PROG - 0 IS SELF
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
>
; (((↑↑↑)))

; (((TENEX)))
IFN F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	REPEAT 4,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBUFS
LJFN:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBUFS-1>

CMDMOD:	0

FLAGDD:	0
FLAGDE:	0
FLAGTT:	0

MOVSUM:	0
MOVSPA:	0
MOVTIM:	0

; * BLOCKS

CONTEX:	BLOCK	LBUFS

ABUF:	BLOCK	SBUFS
UBUF1:	BLOCK	LBUFS
UBUF2:	BLOCK	SBUFS

PBUF:	BLOCK	LBUFS
GBUF1:	BLOCK	LBUFS
GBUF2:	BLOCK	LBUFS

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ



	END	DFTP